////////////////////////////////////////////////////////////////////
// Programme de génération du listing du patch de Chrono Cross
// En ce qui concerne le Scénario et les Combats
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction
// Date de création :		26/05/04
// Dernière modification :	26/05/04
////////////////////////////////////////////////////////////////////

#include "Listing.h"

/*------------------------------------------------------------------
  Génération de listing pour la multitude de fichier script
--------------------------------------------------------------------
 <- infos : type de script à insérer, nom du fichier d'infos
------------------------------------------------------------------*/
void Lst_Genere(char *infos) {
	// Fichiers
	FILE *infos_f, *lst_f;
	// Nom de l'iso (chemin)
	char fichier[LST_NOM_MAX];
	// Numero de fichier
	int num, offset, saut, script;
	// Ligne
	char ligne[LST_LIGNE_MAX];
	char titre[LST_LIGNE_MAX];
	// Dossiers et fichier
	char dir_out[LST_NOM_MAX];
	char dir_in[LST_NOM_MAX];
	char fich_out[LST_NOM_MAX];
	char fich_in1[LST_NOM_MAX];
	char fich_in2[LST_NOM_MAX];
	// Tabulation
	int tab = LST_TAB_MIN;
	int i;

	Main_Message_S("Generation du listing %s.\n",infos,OK);

	/*
	// Fichier dump de test
	sprintf(fichier,"%s%s",DIR_PATCH,"Dump.out");
	FILE *dump_f = fopen(fichier,"wb");
	FILE *in_f;
	char buffer[2048];
	int nb;
	*/

	// Ouverture du fichier des infos principales
	sprintf(fichier,"%s%s%s%s.%s",
		DIR_INFOS,DIR_INFOS_GRP,infos,LST_SUFFIXE,EXT_INFOS);
	infos_f=fopen(fichier,"rb");

	if (infos_f==NULL)
		Main_Message_S("Erreur d'ouverture des infos.\n","",ER);
	else {
		// Ouverture du fichier de sortie
		sprintf(fichier,"%s%s.%s", DIR_PATCH,infos,EXT_LST);
		lst_f=fopen(fichier,"w");

		// Titre des textes
		fgets(ligne,LST_LIGNE_MAX,infos_f);
		// Numero de fichier d'offset
		fgets(ligne,LST_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&offset);
		// Saut entre les fichiers
		fgets(ligne,LST_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&saut);
		// Numero de fichier de texte
		fgets(ligne,LST_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&script);

		// Noms de fichiers
		sprintf(fich_in1,"%04d*.lzs",script);
		sprintf(fich_in2,"%04d*.scn",script);
		sprintf(fich_out,"%04d",script);

		// Ecriture de l'entete
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CGROUP,infos);
		tab++;

		// Récupération des noms de fichiers
		while (fgets(ligne,LST_LIGNE_MAX,infos_f)!=NULL) {
			// Cas d'un commentaire ou d'un blanc
			if (ligne[0]!=COMMENT
				&& sscanf(ligne,"%d",&num)>0)
			{
				// Ecriture du titre
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				sprintf(titre,LST_TITRE,infos,num);
				fprintf(lst_f,LST_CGROUP,titre);
				tab++;

				// Vrai numéro de fichier
				num = offset + saut*num;
				// Ecriture du traitement de la room
				// Dump
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				fprintf(lst_f,LST_CDUMP,num);
				// CptD
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				fprintf(lst_f,LST_CCPTD,num);
				// Extraction
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				fprintf(lst_f,LST_CEXTR,num,script);
				// Création du dossier et copie du fichier
				sprintf(dir_in,"%s%s%04d\\",DIR_FICH_OUT,ENT_DOSSIER,num);
				sprintf(dir_out,"%s%s\\%04d%s",DIR_PATCH,infos,num,LST_DIR_SUFF);
				mkdir(dir_out);
				strcat(dir_out,"\\");
				if (Fichier_Copie_Std(fich_in1, dir_in, fich_out, dir_out)!=OK)
					if (Fichier_Copie_Std(fich_in2, dir_in, fich_out, dir_out)!=OK)
						Main_Message_D("Erreur de listing de %d.\n",num,OK);

				/*
				// Dump dans le fichier unique
				sprintf(fichier,"%s0008 (Script).lzs",dir_in);
				in_f = fopen(fichier,"rb");
				if (in_f==NULL) {
					sprintf(fichier,"%s0001 (Script).scn",dir_in,fich_in2);
					in_f = fopen(fichier,"rb");
				}
				while((nb = fread(buffer,1,2048,in_f))>0)
					fwrite(buffer,1,nb,dump_f);
				fclose(in_f);
				*/

				// CptC
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				fprintf(lst_f,LST_CCPTC,num);
				// Rein
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				fprintf(lst_f,LST_CREIN,num);

				// Ecriture de la fin de bloc
				tab--;
				for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
				fprintf(lst_f,LST_CEND);
			}
		}
		// Ecriture de la fin de bloc
		tab--;
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CEND);

		// Fermeture du fichier des infos
		fclose(infos_f);
	}
	Main_OK();

	/*
	fclose(dump_f);
	*/
}

/*------------------------------------------------------------------
  Génération de listing pour les personnages
------------------------------------------------------------------*/
void Lst_Persos(void) {
	// Fichiers
	FILE *infos_f, *lst_f;
	char infos[LST_NOM_MAX];
	// Nom de l'iso (chemin)
	char fichier[LST_NOM_MAX];
	// Numero de fichier
	int num;
	// Ligne
	char titre[LST_LIGNE_MAX];
	// Dossiers et fichier
	char dir_out[LST_NOM_MAX];
	char dir_in[LST_NOM_MAX];
	char fich_out[LST_NOM_MAX];
	char fich_in[LST_NOM_MAX];
	// Tabulation
	int tab = LST_TAB_MIN;
	int i;

	strcpy(infos,LST_PERSO_NOM);
	Main_Message_S("Generation du listing %s.\n",infos,OK);

	// Ouverture du fichier de sortie
	sprintf(fichier,"%s%s.%s",DIR_PATCH,infos,EXT_LST);
	lst_f=fopen(fichier,"w");

	// Noms de fichiers
	sprintf(fich_in,"%04d*.%s",LST_PERSO_FICH,EXT_TXT);
	sprintf(fich_out,"%04d",LST_PERSO_FICH);

	// Ecriture de l'entete
	for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
	fprintf(lst_f,LST_CGROUP,infos);
	tab++;

	// Parcours des persos
	for (num=LST_PERSO_DEB; num<=LST_PERSO_FIN; num++) {
		// Ecriture du titre
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		sprintf(titre,LST_TITRE,infos,num-LST_PERSO_DEB);
		fprintf(lst_f,LST_CGROUP,titre);
		tab++;

		// Ecriture du traitement de la room
		// Dump
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CDUMP,num);
		// CptD
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CCPTD,num);
		// Extraction
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CEXTR,num,LST_PERSO_FICH);
		// Création du dossier et copie du fichier
		sprintf(dir_in,"%s%s%04d\\",DIR_FICH_OUT,ENT_DOSSIER,num);
		sprintf(dir_out,"%s%s\\%04d%s",DIR_PATCH,infos,num,LST_DIR_SUFF);
		mkdir(dir_out);
		sprintf(dir_out,"%s%s\\%04d%s\\",DIR_PATCH,infos,num,LST_DIR_SUFF);
		if (Fichier_Copie_Std(fich_in, dir_in, fich_out, dir_out)!=OK)
			Main_Message_D("Erreur de listing de %d.\n",num,OK);
		// CptC
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CCPTC,num);
		// Rein
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CREIN,num);

		// Ecriture de la fin de bloc
		tab--;
		for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
		fprintf(lst_f,LST_CEND);
	}
	// Ecriture de la fin de bloc
	tab--;
	for(i=0;i<tab;i++) fprintf(lst_f,LST_TAB);
	fprintf(lst_f,LST_CEND);

	// Fermeture du fichier des infos
	fclose(infos_f);
	Main_OK();
}

/*------------------------------------------------------------------
  Parse et prépare le chemin d'accès
--------------------------------------------------------------------
 <- chemin : chemin d'accès au fichier
 -> dir1 : chemin d'entrée
 -> dir2 : chemin de sortie
 -> nom : nom de fichier
------------------------------------------------------------------*/
void Lst_Chemin(char *chemin, char *dir1, char *dir2, char *nom) {
	// Chemin temporaire
	char *dir;
	// Décomposition du chemin en dossiers
	while((dir=strtok_cc(chemin,'/'))!=NULL) {
		strcat(dir2,chemin);
		strcat(dir2,"\\");
		chemin[4]=0;
		strcat(dir1,"D");
		strcat(dir1,chemin);
		strcat(dir1,"\\");
		// On passe au suivant
		chemin=dir;
	}
	// Nom de fichier
	strcpy(nom,chemin);
}

/*------------------------------------------------------------------
  Génération ou copie de fichier finaux en fonction du listing
------------------------------------------------------------------*/
void Lst_Fichiers(char *dossier) {
	// Fichiers
	FILE *lst_f;
	char fichier[LST_NOM_MAX];
	// Ligne
	char ligne[LST_LIGNE_MAX];
	char param[LST_LIGNE_MAX];
	// Dossiers et fichiers (bourrin)
	// Sans libération en plus pour l'allocation dynamique :(
	char dir_base[LST_NOM_MAX];
	char dir_out[LST_NOM_MAX];
	char dir_in[LST_NOM_MAX];
	char dir_in1[LST_NOM_MAX];
	char dir_in2[LST_NOM_MAX];
	char nom[LST_NOM_MAX];
	char fich_ips[LST_NOM_MAX];
	char fich_in1[LST_NOM_MAX];
	char fich_in2[LST_NOM_MAX];
	char *fich_complet1;
	char *fich_complet2;
	char *ips;

	Main_Message_S("Generation du dossier de patch...","",OK);

	// Ouverture du fichier de listing
	sprintf(dir_base,"%s%s\\",DIR_PATCH_FULL,dossier);
	sprintf(fichier,"%s%s.%s",dir_base,FICH_LISTING,EXT_LST);
	lst_f=fopen(fichier,"r");

	// Test d'ouverture
	if (lst_f==NULL) {
		Main_Message_S("Listing introuvable\n","",ER);
		return;
	}

	// Sous répertoire des éléments
	sprintf(dir_base,"%s%s\\%s",DIR_PATCH_FULL,dossier,DIR_PATCH_ELEMS);
	mkdir(dir_base);

	// Parcours du listing
	while (fgets(ligne,LST_LIGNE_MAX,lst_f)!=NULL) {
		// Recherche d'une extraction
		if (sscanf(ligne,LST_CMOTIF,param)>0) {
			// Analyse et création du chemin
			strcpy(dir_in,"");
			strcpy(dir_out,dir_base);
			Lst_Chemin(param,dir_in,dir_out,nom);
			// Création du dossier de sortie
			mkdir(dir_out);
			// Sélection IPS ou copie directe
			ips = strtok_cc(nom,'.');
			if (ips!=NULL) {
				// Cas d'un IPS
				// Recherche des fichiers
				sprintf(dir_in1,"%s%s",DIR_FICH_IN,dir_in);
				Fichier_Cherche_Ext(dir_in1,nom,&fich_complet1);
				sprintf(dir_in2,"%s%s",DIR_FICH_OUT,dir_in);
				Fichier_Cherche_Ext(dir_in2,nom,&fich_complet2);
				if (fich_complet1==NULL)
					Main_Message_S("Fichier avant %s introuvable\n",nom,ER);
				else if (fich_complet1==NULL)
					Main_Message_S("Fichier apres %s introuvable\n",nom,ER);
				else {
					// Création de l'ips
					/* Version interne avec offset sur 4bits */
					// Nom et chemin des fichiers
					sprintf(fich_in1,"%s%s",dir_in1,fich_complet1);
					sprintf(fich_in2,"%s%s",dir_in2,fich_complet2);
					sprintf(fich_ips,"%s%s.ips",dir_out,nom);
					Ips_Creation(fich_in1, fich_in2, fich_ips);
					/* Version externe 
					sprintf(fich_in1,"\"%s%s\"",dir_in1,fich_complet1);
					sprintf(fich_in2,"\"%s%s\"",dir_in2,fich_complet2);
					sprintf(fich_ips,"\"%s%s.ips\"",dir_out,nom);
					_spawnl(_P_WAIT,"uips", "uips", "c", fich_ips, fich_in1, fich_in2, NULL );
					*/
				}
			} else {
				// Cas d'un fichier standard
				sprintf(dir_in1,"%s%s",DIR_FICH_OUT,dir_in);
				Fichier_Cherche_Ext(dir_in1,nom,&fich_complet1);
				if (fich_complet1==NULL)
					Main_Message_S("Fichier %s introuvable\n",nom,ER);
				else {
					// Copie du fichier
					if (Fichier_Copie_Std(fich_complet1,dir_in1,nom,dir_out)!=OK)
						Main_Message_S("Copie impossible de %s\n",nom,ER);
				}
			}
		}
	}

	// Fermeture du fichier des infos
	fclose(lst_f);
	Main_OK();
}
